Kurt Hsu's blog

The Rails developer in taiwan.


  • 首頁

  • 標籤

  • 分類

  • 歸檔

[Rails]第三方測試站串金流 (failed)

發表於 2018-04-27 更新於 2019-08-21 分類於 Rails

這次是失敗的先敘述原因和結果:
1.Pay2Go測試平台雖然是可以正常開啟和使用但似乎不能用了?因為在套件pay2go他敘述了『智付寶第三方金流業務已轉移到智付通,請改用 spgateway』。

2.Pay2Go和Spgateway官方API document和實作上幾乎是一樣的,Spgateway甚至還標明了版本更新日期是2018-01-03,但測試站要串的API需要給予『CheckValue』這個文件沒提到的參數,要怎麼算出來的我不知道,所以最終是一直卡在這關。

實作紀錄


這是Pay2go測試平台,這是Spgateway測試平台,兩個都可以直接簡單註冊資料不必填真實,創立商店後主要需拿到:
商店編號 MerchantID
串些金鑰 HashKey
串些金鑰 HashIV

可以直接把任何繳費服務都打開(預設應該也都是全部開啟),再來就是去裝套件了。

套件上pay2go和 spgateway兩個文件寫的幾乎一樣,這裡用pay2go做示範。

Gemfile
1
gem "pay2go"

$ bundle install

設定整合模式

config/environments/development.rb
1
2
3
4
5
6
Rails.application.configure do
...(略)
config.after_initialize do
Pay2go.integration_mode = :development
end
end

config/environments/production.rb
1
2
3
4
5
6
Rails.application.configure do
...(略)
config.after_initialize do
Pay2go.integration_mode = :production
end
end

加入 pay2go 的 API key
$ touch config/initializers/pay2go.rb

config/initializers/pay2go.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Pay2go.setup do |pay2go|
if Rails.env.development?
pay2go.merchant_id = "1234567" # 放測試站的 key

pay2go.hash_key = "xxxxxxxx"
pay2go.hash_iv = "xxxxxxxx"
pay2go.service_url = "https://cpayment.pay2go.com/MPG/mpg_gateway"
else
pay2go.merchant_id = "1234567" # 放正式站的 key

pay2go.hash_key = "xxxxxxxx"
pay2go.hash_iv = "xxxxxxxx"
pay2go.service_url = "https://payment.pay2go.com/MPG/mpg_gateway"
end
end

此時先把測試站的MerchantID(商店編號), key 和 iv 貼上去

再來設定信用卡付款按鈕
$ mkdir app/services

app/services/pay2go_service.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Pay2goService
def initialize(order)
@order = order
@timestamp = order.created_at.to_i
@merchant_order_no = "#{order.id}s#{Time.now.strftime("%Y%m%d%H%M%S")}"
@total_price = order.total
end

def check_value
d = Digest::SHA256.hexdigest(url_params).upcase
end

def url_params
"HashKey=#{Pay2go.hash_key}&Amt=#{@total_price}&MerchantID=#{Pay2go.merchant_id}&MerchantOrderNo=#{@merchant_order_no}&TimeStamp=#{@timestamp}&Version=1.1&HashIV=#{Pay2go.hash_iv}"
end
end

重開 rails server

新增按鈕的partial

_pay_with_credit_card.html.erb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<%= form_tag Pay2go.service_url, method: :post do  %>
<%= hidden_field_tag "MerchantID", Pay2go.merchant_id %>
<%= hidden_field_tag "HashKey", Pay2go.hash_key %>
<%= hidden_field_tag "HashIV", Pay2go.hash_iv %>
<%= hidden_field_tag "LoginType", "0" %>
<%= hidden_field_tag "RespondType", "JSON" %>
<%= hidden_field_tag "Version", "1.1" %>

<%= hidden_field_tag "ItemDesc", "order_sample" %>
<%= hidden_field_tag "MerchantOrderNo", "#{order.id}s#{Time.now.strftime("%Y%m%d%H%M%S")}" %>
<%= hidden_field_tag "TimeStamp", order.created_at.to_i %>
<%= hidden_field_tag "Amt", order.total %>

<%= hidden_field_tag "CREDIT", "1" %>
<%= hidden_field_tag "ReturnURL", pay2go_cc_notify_order_url(order.token) %>
<%= hidden_field_tag "CheckValue", Pay2goService.new(order).check_value %>

<%= submit_tag "使用信用卡付款", class: "btn btn-danger btn-lg btn-default" %>
<% end %>

然後在想要的頁面的地方render上去

view.html.erb
1
<%= render "pay_with_credit_card", order: @order %>

加上 controller 的 callbacks

some_controller.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
...(略)
protect_from_forgery except: :pay2go_cc_notify

...(略)

def pay2go_cc_notify
@order = Order.find_by_token(params[:id])

if params["Status"] == "SUCCESS"
@order.make_payment!

if @order.is_paid?
flash[:notice] = "信用卡付款成功"
redirect_to account_orders_path
else
render text: "信用卡失敗"
end
else
render text: "交易失敗"
end
end

修改routes

config/routes.rb
1
2
3
resources :comes do
post :pay2go_cc_notify
end

發現post出去的網址即使剛剛在config/initializers/pay2go.rb裡面設定pay2go.service_url測試網址,但他依然post出去的是舊的測試平台網址『https://capi.pay2go.com/MPG/mpg_gateway』。

我就直接把form_tag的action寫死:

_pay_with_credit_card.html.erb
1
2
3
<%= form_tag action="https://cpayment.pay2go.com/MPG/mpg_gateway", method: :post do  %>
…(略)
<% end %>

但測試結果是不行的。

網上很多舊的教學文章引導到這裡但是實際上post出去是失敗的,後來我開始去看官方文件,Pay2Go的說需要:
MerchantID 商店代號
Version 版本請帶1.0
TradeInfo 交易資料 AES 加密
TradeSha 交易資料 SHA256 加密

但我嘗試了許久終究會是TradeSha錯誤,網上也說很有可能是AES 加密先錯誤造成SHA256 加密錯誤,我也試了不下幾個方法,最後才看到文件上說要用Spgateway的套件去做才猜測是不是Pay2Go的套件和測試平台不能用了。

再來換成Spgateway的套件和他的測試平台去實作,那就去把action位置改為Spgateway的測試API吧!

_pay_with_credit_card.html.erb
1
2
3
<%= form_tag action="https://ccore.spgateway.com/MPG/mpg_gateway", method: :post do  %>
…(略)
<% end %>

再到Spgateway測試平台像Pay2Go一樣建立商店取得商店代號和key,把信用卡服務什麼的都打開,然後去修改config/initializers/pay2go.rb把商店代號和key填進去。

結果報的錯誤是檢查碼錯誤...,檢查碼到底是什麼官方文件上都沒有寫,後來一個一個刪除去找發現是CheckValue這個東西有問題,因為當把他從_pay_with_credit_card.html.erb移除後會報錯檢查碼不可空白...,CheckValue又在官方文件上都沒有提到…就這樣嘗試了幾回合後發現自己真的無法通靈就先告一段落了…

此次是我錯誤的結果紀錄,但我發現串正式機的話似乎不用驗證CheckValue,但要串正式機建立真實商店就不是這麼容易了…
那其他的串金流也沒有像這個這麽好串可以callback回來我的localhost,也許是錯過最好的時代了…(苦笑)

# Rails # 金流
[Rails]從零做起 simple line bot
[Linux]Linux 權限管理
  • 文章目錄
  • 本站概要

Kurt Hsu

Progress One Percent Every Day
171 文章
55 分類
163 標籤
RSS
  1. 1. 實作紀錄
© 2020 Kurt Hsu
由 Hexo 強力驅動 v3.8.0
|
主題 – NexT.Muse v7.3.0